package com.faforever.client.mod;
import com.faforever.client.i18n.I18n;
import com.faforever.client.notification.ImmediateNotification;
import com.faforever.client.notification.NotificationService;
import com.faforever.client.reporting.ReportingService;
import com.faforever.client.test.AbstractPlainJavaFxTest;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.image.Image;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import java.util.concurrent.CompletableFuture;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class ModDetailControllerTest extends AbstractPlainJavaFxTest {
@Mock
private ReportingService reportingService;
@Mock
private NotificationService notificationService;
@Mock
private ModService modService;
@Mock
private I18n i18n;
private ModDetailController instance;
private ObservableList<ModInfoBean> installedMods;
@Before
public void setUp() throws Exception {
instance = loadController("mod_detail.fxml");
instance.modService = modService;
instance.notificationService = notificationService;
instance.reportingService = reportingService;
instance.i18n = i18n;
installedMods = FXCollections.observableArrayList();
when(modService.getInstalledMods()).thenReturn(installedMods);
}
@Test
public void testSetMod() throws Exception {
ModInfoBean mod = ModInfoBeanBuilder.create()
.defaultValues()
.name("Mod name")
.author("Mod author")
.thumbnailUrl(getClass().getResource("/theme/images/tray_icon.png").toExternalForm())
.get();
when(modService.loadThumbnail(mod)).thenReturn(new Image("/theme/images/tray_icon.png"));
instance.setMod(mod);
assertThat(instance.nameLabel.getText(), is("Mod name"));
assertThat(instance.authorLabel.getText(), is("Mod author"));
assertThat(instance.thumbnailImageView.getImage(), is(notNullValue()));
verify(modService).loadThumbnail(mod);
}
@Test
public void testSetModNoThumbnail() throws Exception {
ModInfoBean mod = ModInfoBeanBuilder.create()
.defaultValues()
.thumbnailUrl(null)
.get();
instance.setMod(mod);
assertThat(instance.thumbnailImageView.getImage(), notNullValue());
verify(modService, never()).loadThumbnail(mod);
}
@Test
public void testOnInstallButtonClicked() throws Exception {
when(modService.downloadAndInstallMod(any(ModInfoBean.class), any(), any())).thenReturn(CompletableFuture.completedFuture(null));
instance.onInstallButtonClicked();
verify(modService).downloadAndInstallMod(any(ModInfoBean.class), any(), any());
}
@Test
public void testOnInstallButtonClickedInstallindModThrowsException() throws Exception {
CompletableFuture<Void> future = new CompletableFuture<>();
future.completeExceptionally(new Exception("test exception"));
when(modService.downloadAndInstallMod(any(ModInfoBean.class), any(), any())).thenReturn(future);
instance.setMod(ModInfoBeanBuilder.create().defaultValues().get());
instance.onInstallButtonClicked();
verify(modService).downloadAndInstallMod(any(ModInfoBean.class), any(), any());
verify(notificationService).addNotification(any(ImmediateNotification.class));
}
@Test
public void testOnUninstallButtonClicked() throws Exception {
ModInfoBean mod = ModInfoBeanBuilder.create().defaultValues().get();
instance.setMod(mod);
when(modService.uninstallMod(mod)).thenReturn(CompletableFuture.completedFuture(null));
instance.onUninstallButtonClicked();
verify(modService).uninstallMod(mod);
}
@Test
public void testOnUninstallButtonClickedThrowsException() throws Exception {
ModInfoBean mod = ModInfoBeanBuilder.create().defaultValues().get();
instance.setMod(mod);
CompletableFuture<Void> future = new CompletableFuture<>();
future.completeExceptionally(new Exception("test exception"));
when(modService.uninstallMod(mod)).thenReturn(future);
instance.onUninstallButtonClicked();
verify(modService).uninstallMod(mod);
verify(notificationService).addNotification(any(ImmediateNotification.class));
}
@Test
public void testOnCloseButtonClicked() throws Exception {
assertThat(instance.modDetailRoot.isVisible(), is(true));
instance.onCloseButtonClicked();
assertThat(instance.modDetailRoot.isVisible(), is(false));
}
@Test
public void testGetRoot() throws Exception {
assertThat(instance.getRoot(), is(instance.modDetailRoot));
assertThat(instance.getRoot().getParent(), is(nullValue()));
}
@Test
public void testShowUninstallButtonWhenModIsInstalled() throws Exception {
when(modService.isModInstalled("1")).thenReturn(true);
instance.setMod(ModInfoBeanBuilder.create().defaultValues().uid("1").get());
assertThat(instance.installButton.isVisible(), is(false));
assertThat(instance.uninstallButton.isVisible(), is(true));
}
@Test
public void testShowInstallButtonWhenModIsNotInstalled() throws Exception {
when(modService.isModInstalled("1")).thenReturn(false);
instance.setMod(ModInfoBeanBuilder.create().defaultValues().uid("1").get());
assertThat(instance.installButton.isVisible(), is(true));
assertThat(instance.uninstallButton.isVisible(), is(false));
}
@Test
public void testChangeInstalledStateWhenModIsUninstalled() throws Exception {
when(modService.isModInstalled("1")).thenReturn(true);
ModInfoBean mod = ModInfoBeanBuilder.create().defaultValues().uid("1").get();
instance.setMod(mod);
installedMods.add(mod);
assertThat(instance.installButton.isVisible(), is(false));
assertThat(instance.uninstallButton.isVisible(), is(true));
installedMods.remove(mod);
assertThat(instance.installButton.isVisible(), is(true));
assertThat(instance.uninstallButton.isVisible(), is(false));
}
@Test
public void testChangeInstalledStateWhenModIsInstalled() throws Exception {
when(modService.isModInstalled("1")).thenReturn(false);
ModInfoBean mod = ModInfoBeanBuilder.create().defaultValues().uid("1").get();
instance.setMod(mod);
assertThat(instance.installButton.isVisible(), is(true));
assertThat(instance.uninstallButton.isVisible(), is(false));
installedMods.add(mod);
assertThat(instance.installButton.isVisible(), is(false));
assertThat(instance.uninstallButton.isVisible(), is(true));
}
}